package com.wlz;

import com.wlz.config.AppConfig;
import com.wlz.service.PayService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 *  声明式 事务 java 配置 测试
 * @author wlz
 * @date 2022-06-01  9:17 下午
 */
public class MainStarter {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

		for (String beanDefinitionName : context.getBeanDefinitionNames()) {
			System.out.println(beanDefinitionName);
		}

		PayService payService = context.getBean("payServiceImpl",PayService.class);
//		payService.pay("123456789", 1);

		// 测试 事务传播机制
		testPropagation(payService);

	}

	/**
	 *  测试事务传播机制
	 * @param payService
	 */
	public static void testPropagation(PayService payService) {
		// 一、PROPAGATION_REQUIRED (默认)
		// 1. pay 没有事务 updateProductStore 添加事务，并抛出异常      			结果: pay 成功 ， updateProductStore 失败回滚
		// 2. pay 添加事务 updateProductStore 添加事务 并抛出异常       			结果: pay 失败回滚 ，updateProductStore 失败回滚
		// 3. pay 添加事务 并抛出异常 updateProductStore 添加事务       			结果: pay 失败回滚 ，updateProductStore 失败回滚
		// 4. pay 添加事务 执行updateProductStore 前 并抛出异常 updateProductStore 添加事务 并抛出异常      结果: pay 失败回滚 ，updateProductStore 失败回滚
		// 5. pay 添加事务 执行updateProductStore 后 并抛出异常 updateProductStore 添加事务 并抛出异常     结果: pay 失败回滚 ，updateProductStore 失败回滚
		// 6. pay 添加事务 捕获 updateProductStore 异常， updateProductStore 添加事务 并抛出异常			结果: pay 失败回滚 ， updateProductStore 失败回滚
		payService.payPropagationRequired("123456789", 1);

		// 二、PROPAGATION_SUPPORTS
		// 1. pay 没有事务, updateProductStore 添加事务设置SUPPORTS，并抛出异常  				 结果: pay 成功 ， updateProductStore 成功
		// 2. pay 添加事务设置REQUIRED,  updateProductStore 添加事务设置SUPPORTS ，并抛出异常   结果: pay 失败回滚 ， updateProductStore 失败回滚
//		payService.payPropagationSupports("123456789", 1);

		//三、PROPAGATION_MANDATORY
		// 1. pay 没有事务， updateProductStore 添加事务设置MANDATORY， 并抛出异常 				结果: pay 成功 ， updateProductStore 失败回滚
		// 2.  pay 添加事务设置REQUIRED, updateProductStore 添加事务设置MANDATORY， 并抛出异常     结果: pay 失败回滚 ， updateProductStore 失败回滚
//		payService.payPropagationMandatory("123456789", 1);

		//四、REQUIRES_NEW
		// 1. pay 没有事务 ，updateProductStore 添加事务设置REQUIRES_NEW，并抛出异常 				结果: pay 成功 ， updateProductStore 失败回滚
		// 2. pay 添加事务设置REQUIRED ，updateProductStore 添加事务设置REQUIRES_NEW，并抛出异常	结果: pay 失败回滚 ， updateProductStore 失败回滚
		// 3. pay 添加事务设置REQUIRED ，updateProductStore 添加事务设置REQUIRES_NEW，并抛出异常
		// 但是 在pay 里 调用 updateProductStore 方法 进行异常捕获 								结果: pay 成功 ， updateProductStore 失败回滚
		// 4. pay 添加事务设置REQUIRED 并抛出异常，updateProductStore 添加事务设置REQUIRES_NEW     结果: pay 失败回滚 ， updateProductStore 成功
//		payService.payPropagationRequiresNew("123456789", 1);

		//五、NOT_SUPPORTED
		// 1. pay 没有事务， updateProductStore 添加事务设置NOT_SUPPORTED，并抛出异常 			结果: pay 成功 ， updateProductStore 成功
		// 2. pay 添加事务设置REQUIRED, updateProductStore 添加事务设置NOT_SUPPORTED，并抛出异常 	结果: pay 失败回滚 ， updateProductStore 成功
//		payService.payPropagationNotSupported("123456789", 1);

		// 六、NEVER
		// 1. pay 没有事务， updateProductStore 添加事务设置 NEVER，并抛出异常    				结果: pay 成功 ， updateProductStore 成功
		// 2. pay 添加事务设置REQUIRED , updateProductStore NEVER, 并抛出异常					结果: pay 失败回滚 ， updateProductStore 失败回滚
//		payService.payPropagationNever("123456789", 1);

		// 七、NESTED
		// 1.pay 没有事务， updateProductStore 添加事务设置 NESTED，并抛出异常    								结果: pay 成功， updateProductStore 失败回滚
		// 2. pay 添加事务设置REQUIRED 抛出异常, updateProductStore NESTED 										结果: pay 失败回滚 ，updateProductStore 失败回滚
		// 3. pay 添加事务设置REQUIRED 对updateProductStore 进行异常捕获，updateProductStore NESTED 并抛出异常     结果: pay 成功， updateProductStore 失败回滚
//		payService.payPropagationNested("123456789", 1);

	}
}
